package com.yupi.yupicturebackend.api.aliyunai;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.json.JSONUtil;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import com.alibaba.dashscope.utils.JsonUtils;
import com.yupi.yupicturebackend.api.aliyunai.model.CreateImageTaskRequest;
import com.yupi.yupicturebackend.api.aliyunai.model.CreateOutPaintingTaskRequest;
import com.yupi.yupicturebackend.api.aliyunai.model.CreateOutPaintingTaskResponse;
import com.yupi.yupicturebackend.api.aliyunai.model.GetOutPaintingTaskResponse;
import com.yupi.yupicturebackend.exception.BusinessException;
import com.yupi.yupicturebackend.exception.ErrorCode;
import com.yupi.yupicturebackend.exception.ThrowUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@Component
public class AliYunAiApi {
    //读取配置文件
    @Value("${aliYunAi.apiKey}")
    private String apiKey;

    // 创建任务地址
    public static final String CREATE_OUT_PAINTING_TASK_URL = "https://dashscope.aliyuncs.com/api/v1/services/aigc/image2image/out-painting";

    // 查询任务状态
    public static final String GET_OUT_PAINTING_TASK_URL = "https://dashscope.aliyuncs.com/api/v1/tasks/%s";

    /**
     * 创建任务
     *
     * @param createOutPaintingTaskRequest
     * @return
     */
    public CreateOutPaintingTaskResponse createOutPaintingTask(CreateOutPaintingTaskRequest createOutPaintingTaskRequest) {
        if (createOutPaintingTaskRequest == null) {
            throw new BusinessException(ErrorCode.OPERATION_ERROR, "扩图参数为空");
        }
        // 发送请求
        HttpRequest httpRequest = HttpRequest.post(CREATE_OUT_PAINTING_TASK_URL)
                .header("Authorization", "Bearer " + apiKey)
                // 必须开启异步处理
                .header("X-DashScope-Async", "enable")
                .header("Content-Type", "application/json")
                .body(JSONUtil.toJsonStr(createOutPaintingTaskRequest));
        // 处理响应
        try (HttpResponse httpResponse = httpRequest.execute()) {
            if (!httpResponse.isOk()) {
                log.error("请求异常：{}", httpResponse.body());
                throw new BusinessException(ErrorCode.OPERATION_ERROR, "AI 扩图失败");
            }
            CreateOutPaintingTaskResponse createOutPaintingTaskResponse = JSONUtil.toBean(httpResponse.body(), CreateOutPaintingTaskResponse.class);
            if (createOutPaintingTaskResponse.getCode() != null) {
                String errorMessage = createOutPaintingTaskResponse.getMessage();
                log.error("请求异常：{}", errorMessage);
                throw new BusinessException(ErrorCode.OPERATION_ERROR, "AI 扩图失败，" + errorMessage);
            }
            return createOutPaintingTaskResponse;
        }
    }

    /**
     * 查询创建的任务结果
     *
     * @param taskId
     * @return
     */
    public GetOutPaintingTaskResponse getOutPaintingTask(String taskId) {
        if (StrUtil.isBlank(taskId)) {
            throw new BusinessException(ErrorCode.OPERATION_ERROR, "任务 ID 不能为空");
        }
        // 处理响应
        String url = String.format(GET_OUT_PAINTING_TASK_URL, taskId);
        try (HttpResponse httpResponse = HttpRequest.get(url)
                .header("Authorization", "Bearer " + apiKey)
                .execute()) {
            if (!httpResponse.isOk()) {
                log.error("请求异常：{}", httpResponse.body());
                throw new BusinessException(ErrorCode.OPERATION_ERROR, "获取任务结果失败");
            }
            return JSONUtil.toBean(httpResponse.body(), GetOutPaintingTaskResponse.class);
        }
    }


        /**
         * 核心方法：调用Qwen-Image模型生成图像
         * @throws ApiException SDK调用异常（如API接口错误、参数非法等）
         * @throws NoApiKeyException API密钥缺失异常（未配置或配置错误）
         * @throws UploadFileException 文件上传异常（当前示例未涉及文件上传，预留异常）
         * @throws IOException JSON序列化/反序列化异常（如结果转换失败）
         */
        public  String  AiCreatePicture (String text)
                throws ApiException, NoApiKeyException, UploadFileException, IOException {

            System.out.println("提示词: " + text);

            // 1. 创建多模态对话客户端实例（阿里云SDK提供的工具类，用于发起生图请求）
            MultiModalConversation conv = new MultiModalConversation();

            // 2. 构建用户消息（生图的核心输入：角色+提示词）
            MultiModalMessage userMessage = MultiModalMessage.builder() // 使用建造者模式（Builder）创建消息对象，代码更简洁
                    .role(Role.USER.getValue()) // 设置消息角色为"user"（API要求：生图请求必须由用户角色发起）
                    .content( // 设置消息内容：List格式，API要求仅含1个text类型的元素
                            Arrays.asList( // 转为List（因content参数要求为集合类型）
                                    // 单个元素为Map：key固定为"text"，value为正向提示词（描述生成图像的细节）
                                    Collections.singletonMap(
                                            "text",
                                            // createImageTaskRequest.getInput().getMessages().get(0).getContent().get(0).getText()
                                            //"一副典雅庄重的对联悬挂于厅堂之中，房间是个安静古典的中式布置，桌子上放着一些青花瓷，对联上左书“义本生知人机同道善思新”，右书“通云赋智乾坤启数高志远”， 横批“智启通义”，字体飘逸，中间挂在一着一副中国风的画作，内容是岳阳楼。"
                                            text
                                    )
                            )
                    ).build(); // 完成消息对象构建

            // 3. 构建生图参数（可选参数，控制图像生成规则）
            Map<String, Object> parameters = new HashMap<>();
            parameters.put("watermark", true); // 开启水印：生成的图像右下角添加“Qwen-Image生成”水印
            parameters.put("prompt_extend", true); // 开启提示词智能改写：SDK会优化输入的prompt，提升生图效果（耗时增加3-4秒）
            parameters.put("negative_prompt", ""); // 反向提示词：空字符串表示不限制“不希望出现的内容”
            parameters.put("size", "1328*1328"); // 图像分辨率：默认值，宽1328像素、高1328像素（1:1比例）

            // 4. 构建完整的生图请求参数（整合API密钥、模型名、消息、参数）
            MultiModalConversationParam param = MultiModalConversationParam.builder()
                    .apiKey(apiKey) // 传入阿里云API密钥（身份认证核心，缺失会抛NoApiKeyException）
                    .model("qwen-image") // 指定调用的模型：固定为"qwen-image"（通义千问生图模型）
                    .messages(Collections.singletonList(userMessage)) // 传入用户消息列表（API要求仅支持单轮对话，故用 singletonList 生成单元素列表）
                    .parameters(parameters) // 传入步骤3构建的生图参数
                    .build(); // 完成请求参数构建

            // 5. 发起生图请求并获取结果
            MultiModalConversationResult result = conv.call(param); // 调用SDK的call方法，发送请求到阿里云API

            ThrowUtils.throwIf(result.getOutput().getChoices().isEmpty(),ErrorCode.PARAMS_ERROR, "Choices为空");
            ThrowUtils.throwIf(result.getOutput().getChoices().get(0).getMessage().getContent().isEmpty(),ErrorCode.PARAMS_ERROR, "Content为空");

            Map<String, Object> imageUrlMap = result.getOutput().getChoices().get(0).getMessage().getContent().get(0);

            return (String)imageUrlMap.get("image");

        }






    }

